package co.com.travelsoft.ati.daos;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import co.com.travelsoft.ati.entities.Usuarios;
import co.com.travelsoft.ati.exception.TravelSoftException;
import co.com.travelsoft.ati.utils.FabricaSesionesUtil;

/**
 * Clase que permite el manejo de la persistencia de
 * la tabla USUARIOS
 * 
 * @author Luis Eduardo
 *
 */
public class UsuariosDAO {
	
	/**
	 * Permite crear un usuario.
	 * @param eventos 
	 */	
	public static void crear(Usuarios usuarios) throws TravelSoftException{
		Session sesion = FabricaSesionesUtil.getInstancia().getCurrentSession();
		Transaction trx = null;
		try {
			trx = sesion.beginTransaction();
			sesion.save(usuarios);
			trx.commit();
		} catch (Exception e) {
			if(trx!=null && trx.isActive()){
				trx.rollback();
				throw new TravelSoftException("Ha sucedido un error al intentar crear un usuario.", e);
			}
		}
	}
	
	/**
	 * Permite buscar un usuario por su identificacion.
	 * @param usuarios
	 * @return Usuarios : un objeto usuario
	 */	
	public static Usuarios buscarPorId(Usuarios usuarios){
		Session sesion = FabricaSesionesUtil.getInstancia().getCurrentSession();
		Transaction trx = sesion.beginTransaction();
		Usuarios usuario =  (Usuarios)sesion.createQuery("select c from Usuarios as c where c.codigo = :codigo").
				setParameter("codigo", usuarios.getCodigo()).uniqueResult();
        trx.commit();
        return usuario;
		
	}
	
	/**
	 * Permite listar todos los usuarios existentes.
	 * @return List<Usuarios> : una lista de usuarios
	 */
	public static List<Usuarios> listar(){
		Session sesion = FabricaSesionesUtil.getInstancia().getCurrentSession();
    	Transaction trx = sesion.beginTransaction();
    	List<Usuarios> usuarios= sesion.createQuery("select c from Usuarios as c").list();
        trx.commit();
        return usuarios;
	 }
	
	/**
	 * Permite actualizar la informacion de un usuario.
	 * @param usuarios
	 */	
	public static void actualizar(Usuarios usuarios) throws TravelSoftException{
		Session sesion = FabricaSesionesUtil.getInstancia().getCurrentSession();
		Transaction trx = null;
		try {
			trx = sesion.beginTransaction();
			sesion.update(usuarios);
			trx.commit();
		} catch (Exception e) {
			if(trx!=null && trx.isActive()){
				trx.rollback();
				throw new TravelSoftException("Ha sucedido un error al intentar actualizar un usuario.", e);
			}
		}
	}
	
	/**
	 * Permite borrar un usuario.
	 * @param usuarios
	 */	
	public static void borrar(Usuarios usuarios) throws TravelSoftException{
		Session sesion = FabricaSesionesUtil.getInstancia().getCurrentSession();
		Transaction trx = null;
		try {
			trx = sesion.beginTransaction();
			sesion.delete(usuarios);
			trx.commit();
		} catch (Exception e) {
			if(trx!=null && trx.isActive()){
				trx.rollback();
				throw new TravelSoftException("Ha sucedido un error al intentar borrar un usuario.", e);
			}
		}
	}

}
